package com.heima.leetcode.practice;

/**
 * @author 勾新杰
 * @version 1.0
 * @description: leetcode 201. 数字范围按位与
 * @date 2025/10/8 20:56
 */
public class E201 {

    // 分析：
    // 1. 先思考范围内所有数位数相同的情况
    // 1.1 低位会不断的加一翻转，翻转就会产生0
    // 1.2 在所有数中某一位出现0，那么该位所有数之与就是0
    // 1.3 故而这种情况结果就是上界和下界的公共前缀
    // 2. 思考范围内所有数位数不相同的情况
    // 2.1 例如前n位所有数的与注定是n位
    // 2.2 而往后走出现更高位的时候，那么高位的与注定是0
    // 2.3 而低位会不断地加一翻转，也是0
    // 2.4 故而这种情况结果就是0


    /**
     * 结论：从left到right的所有数字的按位与结果，等于left和right二进制表示的公共前缀，后面补0。
     *
     * @param left  左边界
     * @param right 右边界
     * @return 按位与结果
     */
    public int rangeBitwiseAnd(int left, int right) {
        int zeroBit = 0;
        // 公共前缀不相等时循环移位
        while (left != right) {
            left >>= 1;
            right >>= 1;
            zeroBit++;
            // 位数不一致时提前结束
            if (left == 0 && right != 0) {
                return 0;
            }
        }
        // 补零，获取结果
        return left << zeroBit;
    }
}
